
package com.asistencia.DAO;


import com.asistencia.DAO.factory.FactoryDAO;
import com.asistencia.DAO.utils.Connector;
import com.asistencia.DAO.utils.InterfaceDAO;
import com.asistencia.model.Funcionario;
import com.asistencia.model.Modulo;
import com.asistencia.model.Turno;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;

/**
 *
 * @author rfarias
 * Clase de Métodos de datos para turnos
 */
public class TurnoDAO  implements InterfaceDAO{

    /**
     * findAll Recupera todas los turnos disponibles.
     * De acuerdo a las sobrecargas establece filtros adecuados.
     * @return listatrn
     */
    public List findAll() {
     return null;
    }

    public List findAll(String fini, String ffin) {
        List<Turno> listatrn = new ArrayList<Turno>();
        Turno trn;
        StringBuilder qry = new StringBuilder();
             qry.append("SELECT * FROM turno WHERE '")
                .append(fini).append("' >= fecha_desde" + " AND '").append(fini).append("' <= fecha_hasta");
        if (ffin!=null)
        {
             qry.append(" UNION  SELECT * FROM turno WHERE '")
                .append(ffin).append("' >= fecha_desde" + " AND '").append(ffin).append(  "' <= fecha_hasta");
        }
        try{
            System.out.println(qry.toString());
            ResultSet rs = Connector.getStatement().executeQuery(qry.toString());
            while(rs.next())
            {
                 trn = new Turno(
                        rs.getDate("fecha_desde"),
                        rs.getDate("fecha_hasta"),
                        rs.getTime("hora_desde") ,
                        rs.getTime("hora_hasta"),
                        (Modulo) FactoryDAO.getInstance().getDataMod().searchById(rs.getInt("id_modulo"))
                        );
                trn.setId_turno(rs.getInt("id_turno"));
                trn.setFunc((Funcionario) FactoryDAO.getInstance().getDataFun().searchById(rs.getString("rut_funcionario")));
                listatrn.add(trn);
            }
           } catch (Exception ex){
           System.out.println("ERROR: TurnoDAO - Method: findAll - Exception: " + ex.getMessage());
           } finally {
             return listatrn;
           }
    }


    /**
     *
     * @param fun
     * @return listatrn
     */
    public List findAll(String fini, String ffin,Funcionario fun) {
        List<Turno> listatrn = new ArrayList<Turno>();
        Turno trn;
        StringBuilder qry = new StringBuilder();
             qry.append("SELECT * FROM turno WHERE '")
                .append(fini).append("' >= fecha_desde  AND '").append(fini).append("' <= fecha_hasta")
                .append(" AND rut_funcionario='").append(fun.getRut_funcionario());
             if (ffin!=null)
        {
                qry.append("' UNION SELECT * FROM turno WHERE '")
                .append(ffin).append("' >= fecha_desde  AND '").append(ffin).append("' <= fecha_hasta ") 
                .append(" AND rut_funcionario='").append(fun.getRut_funcionario()).append("' ");
        }
        
        try{
            ResultSet rs = Connector.getStatement().executeQuery(qry.toString());
            while(rs.next())
            {
                 trn = new Turno(
                        rs.getDate("fecha_desde"),
                        rs.getDate("fecha_hasta"),
                        rs.getTime("hora_desde") ,
                        rs.getTime("hora_hasta"),
                        (Modulo) FactoryDAO.getInstance().getDataMod().searchById(rs.getInt("id_modulo"))
                        );
                trn.setId_turno(rs.getInt("id_turno"));
                trn.setFunc((Funcionario) FactoryDAO.getInstance().getDataFun().searchById(rs.getString("rut_funcionario")));
                listatrn.add(trn);
            }
           } catch (Exception ex){
            System.out.println("ERROR: TurnoDAO - Method: findAll(fun) - Exception: " + ex.getMessage());
           } finally {
             return listatrn;
           }
    }

    
    public List findAll(String fini, String ffin,Modulo mod) {
       List<Turno> listatrn = new ArrayList<Turno>();
        Turno trn;
        StringBuilder qry = new StringBuilder();
             qry.append("SELECT * FROM turno WHERE '")
                .append(fini).append("' >= fecha_desde AND '").append(fini).append("' <= fecha_hasta")
                .append(" AND id_modulo=").append(mod.getId_Modulo());
             
        if (ffin!=null)
        {
             qry.append(" UNION SELECT * FROM turno WHERE '")
                .append(ffin).append("' >= fecha_desde").append(" AND '").append(ffin).append("' <= fecha_hasta")
                .append(" AND id_modulo=").append(mod.getId_Modulo());
        }
        
       //System.out.println(qry.toString());
        
        try{
            ResultSet rs = Connector.getStatement().executeQuery(qry.toString());

            while(rs.next())
            {
                 trn = new Turno(
                        rs.getDate("fecha_desde"),
                        rs.getDate("fecha_hasta"),
                        rs.getTime("hora_desde") ,
                        rs.getTime("hora_hasta"),
                        (Modulo) FactoryDAO.getInstance().getDataMod().searchById(rs.getInt("id_modulo"))
                        );
                trn.setId_turno(rs.getInt("id_turno"));
                trn.setFunc((Funcionario) FactoryDAO.getInstance().getDataFun().searchById(rs.getString("rut_funcionario")));
                listatrn.add(trn);
            }
           } catch (Exception ex){
            System.out.println("ERROR: TurnoDAO - Method: findAll(mod) - Exception: " + ex.getMessage());
           } finally {
             return listatrn;
           }
    }


     /**
     *
     * @param fini
     * @param ffin
     * @param mod
     * @param fun
     * @return listatrn
     */
    public List findAll(String fini, String ffin,Modulo mod, Funcionario fun) {
       List<Turno> listatrn = new ArrayList<Turno>();
        Turno trn;
        StringBuilder qry = new StringBuilder();
             qry.append("SELECT * FROM turno WHERE '")
                .append(fini).append("' >= fecha_desde AND '").append(fini).append("' <= fecha_hasta")
                .append(" AND id_modulo=").append(mod.getId_Modulo())
                .append(" AND rut_funcionario='").append(fun.getRut_funcionario()).append("' ");
             
        if (ffin!=null)
        {
             qry.append(" UNION SELECT * FROM turno WHERE '")
                .append(ffin).append("' >= fecha_desde").append(" AND '").append(ffin).append("' <= fecha_hasta")
                .append(" AND id_modulo=").append(mod.getId_Modulo())
                .append(" AND rut_funcionario='").append(fun.getRut_funcionario()).append("' ");
        }
        
        try{
            ResultSet rs = Connector.getStatement().executeQuery(qry.toString());

            while(rs.next())
            {
                 trn = new Turno(
                        rs.getDate("fecha_desde"),
                        rs.getDate("fecha_hasta"),
                        rs.getTime("hora_desde") ,
                        rs.getTime("hora_hasta"),
                        (Modulo) FactoryDAO.getInstance().getDataMod().searchById(rs.getInt("id_modulo"))
                        );
                trn.setId_turno(rs.getInt("id_turno"));
                trn.setFunc((Funcionario) FactoryDAO.getInstance().getDataFun().searchById(rs.getString("rut_funcionario")));
                listatrn.add(trn);
            }
           } catch (Exception ex){
            System.out.println("ERROR: TurnoDAO - Method: findAll(mod) - Exception: " + ex.getMessage());
           } finally {
             return listatrn;
           }
    }


public List findUnassigned(Modulo mod) {
        List<Turno> listatrn = new ArrayList<Turno>();
        Turno trn;
        StringBuilder qry = new StringBuilder();
             qry.append("SELECT * FROM turno WHERE rut_funcionario IS NULL ")
                .append(" AND id_modulo=").append(mod.getId_Modulo()).append(" ");
        
        try{
            ResultSet rs = Connector.getStatement().executeQuery(qry.toString());
            while(rs.next())
            {
                 trn = new Turno(
                        rs.getDate("fecha_desde"),
                        rs.getDate("fecha_hasta"),
                        rs.getTime("hora_desde") ,
                        rs.getTime("hora_hasta"),
                        (Modulo) FactoryDAO.getInstance().getDataMod().searchById(rs.getInt("id_modulo"))
                        );
                trn.setId_turno(rs.getInt("id_turno"));
                trn.setFunc((Funcionario) FactoryDAO.getInstance().getDataFun().searchById(rs.getString("rut_funcionario")));
                listatrn.add(trn);
            }
           } catch (Exception ex){
            System.out.println("ERROR: TurnoDAO - Method: findUnassigned - Exception: " + ex.getMessage());
           } finally {
             return listatrn;
           }
    }
    
    
    
    public Object searchById(String id) {  
        Turno trn=null;
        return trn;
    }

        
    public Object searchById(int id) {
        Turno trn = null;
        try{
            ResultSet rs = Connector.getStatement().executeQuery("select * from turno where id_turno = " + id);
            if(rs.next())
            {
                
                trn = new Turno(
                        rs.getDate("fecha_desde"),
                        rs.getDate("fecha_hasta"),
                        rs.getTime("hora_desde"),
                        rs.getTime("hora_hasta"),
                        (Modulo) FactoryDAO.getInstance().getDataMod().searchById(rs.getInt("id_modulo"))
                        );
                trn.setId_turno(rs.getInt("id_turno"));
            }
        } catch (Exception ex){
            System.out.println("ERROR: TurnoDAO - Method: findAll - Exception: " + ex.getMessage());
        } finally {

            return trn;
        }
    }
    
    
    public Object update(Object obj) {
        Turno trn=(Turno) obj;
        StringBuilder qry = new StringBuilder();
        Statement st = Connector.getStatement();
        qry.append("update turno set ");
        qry.append(" fecha_desde = '")      .append(trn.getFecha_desde())               .append("',");
        qry.append(" fecha_hasta  = '")     .append(trn.getFecha_hasta())               .append("',");
        qry.append(" hora_desde = '")       .append(trn.getHora_ini())                  .append("',");
        qry.append(" hora_hasta = '")       .append(trn.getHora_fin())                  .append("',");
        qry.append(" id_modulo = ")         .append(trn.getMod().getId_Modulo())        .append(" ");
        qry.append(" where id_turno = ")    .append(trn.getId_turno())                  .append(" ");
        
        try {
            int res = st.executeUpdate(qry.toString());
            if (res==1)
            {
                return trn;
            }
            else
            {
                return null;
            }
        } catch (SQLException ex) {
           System.out.println("ERROR: TurnoDAO - Method: update - Exception: " + ex.getMessage());
           return null;
        }

    }

        public Object asign(Object obj) {
        Turno trn=(Turno) obj;
        StringBuilder qry = new StringBuilder();
        Statement st = Connector.getStatement();
        qry.append("update turno set ");
        qry.append(" fecha_desde = '")      .append(trn.getFecha_desde())               .append("',");
        qry.append(" fecha_hasta  = '")     .append(trn.getFecha_hasta())               .append("',");
        qry.append(" hora_desde = '")       .append(trn.getHora_ini())                  .append("',");
        qry.append(" hora_hasta = '")       .append(trn.getHora_fin())                  .append("',");
        qry.append(" rut_funcionario = '")  .append(trn.getFunc().getRut_funcionario()) .append("',");
        qry.append(" id_modulo = ")         .append(trn.getMod().getId_Modulo())        .append(" ");
        qry.append(" where id_turno = ")    .append(trn.getId_turno())                  .append(" ");
        
        try {
            int res = st.executeUpdate(qry.toString());
            if (res==1)
            {
                return trn;
            }
            else
            {
                return null;
            }
        } catch (SQLException ex) {
           System.out.println("ERROR: TurnoDAO - Method: update - Exception: " + ex.getMessage());
           return null;
        }

    }

    public Object insert(Object obj) {
        Turno trn=(Turno) obj;
        Turno turn=new Turno();
        StringBuilder qry = new StringBuilder();
        Statement st = Connector.getStatement();
        qry.append("insert into turno (fecha_desde,fecha_hasta, hora_desde,hora_hasta,id_modulo) values(");
        qry.append(" '") .append(trn.getFecha_desde())       .append("',");
        qry.append(" '") .append(trn.getFecha_hasta())       .append("',");
        qry.append(" '") .append(trn.getHora_ini())          .append("',");
        qry.append(" '") .append(trn.getHora_fin())          .append("',");
        qry.append(" ")  .append(trn.getMod().getId_Modulo()).append(")");
        
        
        try {
            int res = st.executeUpdate(qry.toString(), Statement.RETURN_GENERATED_KEYS);
            ResultSet rs = st.getGeneratedKeys();
            if (res>0)
            {
             while(rs.next())
             {
                JOptionPane.showMessageDialog(null, rs.getInt(1));
                turn= (Turno) FactoryDAO.getInstance().getDataTur().searchById(rs.getInt(1));
                
             }
             return turn;
            }
            else
            {
                return null;
            }
        } catch (SQLException ex) {
           System.out.println("ERROR: TurnoDAO - Method: insert - Exception: " + ex.getMessage());
           return null;
        }
    }

    public boolean delete(Object obj) {
        Turno trn=(Turno) obj;
        StringBuilder qry = new StringBuilder();
        Statement st = Connector.getStatement();
        qry.append("delete from turno where id_turno=").append(trn.getId_turno());
        
        try {
            int res = st.executeUpdate(qry.toString());
            if (res==1)
            {
                return true;
            }
            else
            {
                return false;
            }
        } catch (SQLException ex) {
           System.out.println("ERROR: TurnoDAO - Method: insert - Exception: " + ex.getMessage());
           return false;
        }
    }
}
